//! PKCS#1 public key tests

use hex_literal::hex;
use pkcs1::RsaPublicKey;

#[cfg(feature = "pem")]
use pkcs1::{der::Document, RsaPublicKeyDocument};

/// RSA-2048 PKCS#1 public key encoded as ASN.1 DER.
///
/// Note: this key is extracted from the corresponding `rsa2048-priv.der`
/// example key in the `pkcs8` crate.
const RSA_2048_DER_EXAMPLE: &[u8] = include_bytes!("examples/rsa2048-pub.der");

/// RSA-4096 PKCS#1 public key encoded as ASN.1 DER
const RSA_4096_DER_EXAMPLE: &[u8] = include_bytes!("examples/rsa4096-pub.der");

/// RSA-2048 PKCS#1 public key encoded as PEM
#[cfg(feature = "pem")]
const RSA_2048_PEM_EXAMPLE: &str = include_str!("examples/rsa2048-pub.pem");

/// RSA-4096 PKCS#1 public key encoded as PEM
#[cfg(feature = "pem")]
const RSA_4096_PEM_EXAMPLE: &str = include_str!("examples/rsa4096-pub.pem");

#[test]
fn decode_rsa2048_der() {
    let key = RsaPublicKey::try_from(RSA_2048_DER_EXAMPLE).unwrap();

    // Extracted using:
    // $ openssl asn1parse -in tests/examples/rsa2048-pub.pem
    assert_eq!(key.modulus.as_bytes(), hex!("B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEAC89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"));
    assert_eq!(key.public_exponent.as_bytes(), hex!("010001"));
}

#[test]
fn decode_rsa4096_der() {
    let key = RsaPublicKey::try_from(RSA_4096_DER_EXAMPLE).unwrap();

    // Extracted using:
    // $ openssl asn1parse -in tests/examples/rsa4096-pub.pem
    assert_eq!(key.modulus.as_bytes(), hex!("A7A74572811EA2617E49E85BD730DDE30F103F7D88EE3F765E540D3DD993BBB0BA140002859D0B40897436637F58B828EA74DF8321634077F99D4AA2D54CA375852EF597661D3713CE1EF3B4FD6A8E220238E467668A2C7EE3861D2212AE6A1EBDDFA88B62DF10F6BCF79EFF4AC298FB2563DF1B8764381AF9B1FB0CCD085E026B0AD9F6721A235177D0396B48754AD4A75242250A873BF2F6E7EE3C75DD613E365BA4F3210A6CC66B90A2FA3F762CA6884087B6BF8161EB144819F0F572F21F6C8E273E70D45A365B8B2819CE734613CC23B01329A17901F17078403861F54C52A051E2A58C75C2D9D80091BB9808A106C1F7ECB4034E15058BEEC725C5F919D62EAA234B62628D346C60BB919E70851DAB38571E6F0ED7634129F994EA368FEE7373DFDEC04445EBCA47FA20ED1540A860C948BABC98DA591CA1DE2E2E25540EF9B7CB353F60213B814A45D359EFA9B811EEFF08C65993BF8A85C2BFEAAA7ED5E6B43E18AE604464CE5F96150136E7D09F8B24FAD43D7870118CFA7BC24875506EBBC321B977E0861AEA50128620121F0B394A9CDD0A42411A1350C0770D975D71B00A90436240C967A0C3A5C20A0F6DE77F3F2CAFDA94ED0143C1F6E34F73E0CAC279EEEB7C637723A2B026C82802E1A4AEBAA8846DF98E7919498773E0D4F319956F4DE3AAD00EFB9A147D66B3AC1A01D35B2CFB48D400B0E7A80DC97551"));
    assert_eq!(key.public_exponent.as_bytes(), hex!("010001"));
}

#[test]
#[cfg(feature = "pem")]
fn decode_rsa_2048_pem() {
    let pkcs1_doc: RsaPublicKeyDocument = RSA_2048_PEM_EXAMPLE.parse().unwrap();
    assert_eq!(pkcs1_doc.as_ref(), RSA_2048_DER_EXAMPLE);

    // Ensure `RsaPublicKeyDocument` parses successfully
    let pk = RsaPublicKey::try_from(RSA_2048_DER_EXAMPLE).unwrap();
    assert_eq!(pkcs1_doc.decode().modulus.as_bytes(), pk.modulus.as_bytes());
}

#[test]
#[cfg(feature = "pem")]
fn decode_rsa_4096_pem() {
    let pkcs1_doc: RsaPublicKeyDocument = RSA_4096_PEM_EXAMPLE.parse().unwrap();
    assert_eq!(pkcs1_doc.as_ref(), RSA_4096_DER_EXAMPLE);

    // Ensure `RsaPublicKeyDocument` parses successfully
    let pk = RsaPublicKey::try_from(RSA_4096_DER_EXAMPLE).unwrap();
    assert_eq!(pkcs1_doc.decode().modulus.as_bytes(), pk.modulus.as_bytes());
}
